package com.partynetwork.dataprovider.util;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
/**
* 描述gps应用,gps定位与网络定位
* @author 沈跃双
*
*/
public class GPS implements LocationListener{
/**
* 上下文,从这里获取gps功能
*/
private static Context mContext;
/**
* 单例对象
*/
private static GPS mGps;
private static LocationManager mLocationManager;
private GPS(OnGpsChangeListener gpsChangeListener){
GPS.mContext = (Context)gpsChangeListener;
this.gpsChangeListener = gpsChangeListener;
}
/**
* 单例函数
* @param context
* @return
*/
public static GPS instance(OnGpsChangeListener gpsChangeListener){
GPS.mContext = (Context)gpsChangeListener;
if(null == mGps){
mGps = new GPS(gpsChangeListener);
}
return mGps;
}
/**
* 回调接口
* @author 沈跃双
*/
public interface OnGpsChangeListener{
/**
* 当知道最后一个gps定位的坐标时回调
* @param location
*/
void OnLastKnowLocation(GPSData data);
/**
* 当定位成功时回调
*/
void OnLocationChanged(GPSData data);
}
private OnGpsChangeListener gpsChangeListener;
/**
* gps数据结构
* @author 沈跃双
*/
public class GPSData{
/**
* 维度
*/
public double latitude;
/**
* 经度
*/
public double longitude;
/**
* 城市名
*/
public String cityName;
/**
* 具体街道地址
*/
public String address;
}
/**
* 开始定位,一次性执行
* 定位成功后,释放对象
*/
public void startGPS(){
mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
//得到最后一次获取的精度维度
Location lastKnownLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
//如果记录存在,则封装数据,并回调
if(null != lastKnownLocation){
GPSData data = new GPSData();
data.latitude = lastKnownLocation.getLatitude();
data.longitude = lastKnownLocation.getLongitude();
gpsChangeListener.OnLastKnowLocation(data);
}
String provider= null;
if(mLocationManager.isProviderEnabled("network")){
provider = "network";
}else if(mLocationManager.isProviderEnabled("gps")){
provider = "gps";
}else{
return;
}
//注册监听
mLocationManager.requestLocationUpdates(provider, 1, 1000f, this);
}
/**
* 当gps经纬度发生变化时调用
*/
public void onLocationChanged(Location location) {
/*
* 获取经度纬度,封装数据
*/
GPSData data = new GPSData();
data.latitude = location.getLatitude();
data.longitude = location.getLongitude();
Geocoder gc = new Geocoder(mContext , Locale.getDefault());
/*
* 获取本地信息,从中获取城市名
* 并封装数据
*/
try {
List<Address> addresses = gc.getFromLocation(data.latitude, data.longitude, 1);
if(addresses.size() > 0){
Address address = addresses.get(0);
data.cityName = address.getLocality();
}
} catch (IOException e) {
e.printStackTrace();
}
gpsChangeListener.OnLocationChanged(data);
this.closeGPS();
}
public void onProviderDisabled(String provider) {
System.out.println("onProviderDisabled"+provider);
}
public void onProviderEnabled(String provider) {
System.out.println("onProviderEnabled"+provider);
}
public void onStatusChanged(String provider, int status, Bundle extras) {
System.out.println("onStatusChanged");
}
/**
* 关闭gps
*/
public void closeGPS(){
if(mLocationManager != null){
mLocationManager.removeUpdates(this);
mLocationManager = null;
}
}
}